# -*- encoding: utf-8 -*-
import pygame, sys
from pygame.locals import *
from Mapa import Mapa
from nodoArbol import nodoArbol
from collections import deque
class Principal:
  def __init__(self):
    self.juego = Mapa()
    archivo = open("prioridades.txt", "r")
    self.__prioridades = archivo.readlines()
    self.listaAlrededores = deque([])
    for x in range (0, len(self.__prioridades)):
      self.__prioridades[x] = self.__prioridades[x].replace("\n", "")
    self.__arregloPrioridades = []
    self.bandera = False
    self.tamX, self.tamY = self.juego.regresaDimension()
    self.tamX = self.tamX * 32
    self.tamY = self.tamY * 32
    self.velocidad = 32
    pygame.init()
    self.ventana = pygame.display.set_mode((self.tamX, self.tamY))
    self.posMX, self.posMY = (0,0)
    self.casIX, self.casIY =(4,5)	# Casilla actual
    self.metaX, self.metaY = (0,6) #Casilla Meta
    self.cola = deque([])
    self.cola.append((self. casIX, self.casIY))
    self.nodoPadre = self.cola.popleft()
    self.__raiz = nodoArbol((self.casIX, self.casIY), self.__prioridades, "Nodo Raiz", 0)
    self.posPX, self.posPY = (self.casIX*32,self.casIY*32)
    self.sprite = pygame.image.load("Imagenes/Chocobo1.png")
    self.meta = pygame.image.load("Imagenes/Meta.png")
    self.imagenes = self.juego.retornaListaImagenes()
   # pygame.mixer.music.load("Chocobo.mp3")
    #pygame.mixer.music.play()
    while True:
      self.juego.dibujarAlrededores(self.casIX,self.casIY )
      #self.juego.ImprimirTerreno(self.casIX, self.casIY);
      self.actualizar()
      if self.juego.verificaAlrededores(self.casIX, self.casIY)[0] > 1:
	self.juego.marcarDes(self.casIX, self.casIY)
      if self.DecidirSiAdelantar():
	self.quitarPasillos()
      else:
	if len(self.juego.regresaListaAlrededores(self.casIX, self.casIY)) > 1:
	  self.cola.append(( self.casIX, self.casIY))
	  if self.casIX == self.nodoPadre[0] and self.casIY == self.nodoPadre[1]:
	    print "El que se repite"
	    print self.cola.popleft()
	if len(self.juego.regresaListaAlrededores(self.casIX, self.casIY)) == 0 and self.bandera:
	   self.nodoPadre = self.cola.popleft()
	   self.casIX, self.casIY = self.nodoPadre
	if self.contarElementosDeCola(self.listaAlrededores) == 0:
	  self.colaAlrededores()
	else:
	  self.casIX, self.casIY = self.nodoPadre
        self.busquedaPorAnchura()
      pygame.time.delay(500)
      #print "X = ", self.casIX, "Y = ", self.casIY
     # print self.juego.verificaAlrededores(self.casIX, self.casIY)
      #self.juego.ImprimirTerreno(self.casIX, self.casIY);
      for evento in pygame.event.get():
	if evento.type == QUIT:
	  pygame.quit()
	  sys.exit()
	"""if evento.type == pygame.KEYDOWN:
	  if evento.key == K_UP:
	    self.moverArriba()
	  if evento.key == K_DOWN:
	    self.moverAbajo()
	  if evento.key == K_LEFT:
	    self.moverIzquierda()
	  if evento.key == K_RIGHT:
	    self.moverDerecha()"""
      pygame.display.update()
  def actualizar(self):
    self.imagenes = self.juego.retornaListaImagenes()
    self.posMY = 0
    for lista in self.imagenes:
      self.posMX = 0
      for imagen in lista:
	self.ventana.blit(imagen, (self.posMX, self.posMY))
	if self.juego.revisaBandera(self.posMX/32,self.posMY/32):
	  self.ventana.blit(self.juego.regresarBandera(self.posMX/32, self.posMY/32), (self.posMX, self.posMY))
	if self.juego.regresarDesicionCor(self.posMX/32, self.posMY/32):
	  self.ventana.blit(self.juego.regresaDesicionIMG(self.posMX/32, self.posMY/32), (self.posMX, self.posMY))
	self.posMX = self.posMX + 32
      self.posMY = self.posMY + 32
      self.posPX, self.posPY = self.casIX, self.casIY
      self.ventana.blit(self.meta, (self.metaX*32, self.metaY*32))
      self.ventana.blit(self.sprite, (self.posPX*32, self.posPY*32))
  def moverAbajo(self):
    if self.juego.revisaAccesoPorCoordenada(self.casIX,(self.casIY + 1)):
      if self.posPY + 32 < self.tamY:
	self.posPY = self.posPY + self.velocidad
	self.casIY = self.casIY + 1
	self.sprite = pygame.image.load("Imagenes/Chocobo1.png")
  def moverArriba(self):
    if self.juego.revisaAccesoPorCoordenada(self.casIX,(self.casIY - 1)):
      if self.posPY > 0:
	self.posPY = self.posPY - self.velocidad
	self.casIY = self.casIY - 1
	self.sprite = pygame.image.load("Imagenes/Chocobo4.png")
  def moverDerecha(self):
    if self.juego.revisaAccesoPorCoordenada((self.casIX + 1),self.casIY):
      if self.posPX + 32 < self.tamX:
	self.posPX = self.posPX + self.velocidad
	self.casIX = self.casIX + 1
	self.sprite = pygame.image.load("Imagenes/Chocobo2.png")
  def moverIzquierda(self):
    if self.juego.revisaAccesoPorCoordenada((self.casIX - 1),self.casIY):
      if self.posPX > 0:
	self.posPX = self.posPX - self.velocidad
	self.casIX = self.casIX - 1
	self.sprite = pygame.image.load("Imagenes/Chocobo3.png")
  def quitarPasillos(self):
    self.actualizar()
    dirLibre, direccion = self.juego.verificaAlrededores(self.casIX, self.casIY)
    if dirLibre == 1:
      if direccion == "arriba":
	self.moverArriba()
      if direccion == "abajo":
	self.moverAbajo()
      if direccion == "derecha":
	self.moverDerecha()
      if direccion == "izquierda":
	self.moverIzquierda()
  def colocarBandera(self):
    self.ventana.blit(self.juego.regresarBandera(self.casIX, self.casIY), (self.casIX*32, self.casIY*32))

  #quitarPasillosTodos
  def contarElementosDeCola(self, cola):
    i = 0
    for aux in cola:
      i = i + 1
    return i
  def DecidirSiAdelantar(self):
    if len(self.juego.regresaListaAlrededores(self.casIX, self.casIY)) == 1:
      return True
    else:
      return False
# Búsqueda por profundidad #
  def colaAlrededores(self):
    self.bandera = False
    for prioridades in self.__prioridades:
      alrededores = self.juego.regresaListaAlrededores(self.casIX, self.casIY)
      for listaAlr in alrededores:
	if prioridades == listaAlr:
	  self.listaAlrededores.append(prioridades)

  def busquedaPorAnchura(self):
   print "\n--------------------------------------------------------------------------\nNodoPadre"
   print self.nodoPadre
   print "cola"
   print self.cola
   print "ListaAlrededores de la coordenada"
   print self.listaAlrededores
   print "\n--------------------------------------------------------------------------\n"
   try:
     self.hacerRespectoAlaPrioridad(self.listaAlrededores.popleft())
     """if self.contarElementosDeCola(self.listaAlrededores) == 0:
       self.bandera = True"""
   except IndexError:
     self.bandera = True
   return
  def hacerRespectoAlaPrioridad(self, elemento):
    if elemento == "arriba":
      self.moverArriba()
    elif elemento == "abajo":
      self.moverAbajo()
    elif elemento == "derecha":
      self.moverDerecha()
    elif elemento == "izquierda":
      self.moverIzquierda()
    self.actualizar()
inicio = Principal()

